package com.ken.common.web.vaild.constraint;

import com.ken.common.web.utils.ApplicationContextUtils;
import com.ken.common.web.vaild.annotation.KenVaild;
import com.ken.common.web.vaild.handler.KenVaildHandler;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Optional;

/**
 * 自定义的参数校验类
 */
public class KenVaildConstraint implements ConstraintValidator<KenVaild, Object> {

    private KenVaild kenVaild;

    @Override
    public void initialize(KenVaild kenVaild) {
        this.kenVaild = kenVaild;
    }

    /**
     * 实际的校验方法
     * true表示校验通过
     * false 表示不通过
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        //判断非空
        if (value != null) {
            Class<? extends KenVaildHandler> handler = kenVaild.handler();
            //交给KenVaildHandler处理该数据
            KenVaildHandler kenVaildHandler = ApplicationContextUtils.getBean(handler);
            return Optional
                    .ofNullable(kenVaildHandler)
                    .map(kenVaildHandler1 -> {
                        return kenVaildHandler.vaild(kenVaild, value);
                    }).orElse(false);
        }
        //如果校验数据为null，则直接通过校验
        return true;
    }
}
